package com.mm.learn.designpatterns.singleton;

/**
 * @author wdx
 * @date 2021年03月31日 17:24
 * <p>
 * 懒汉式 静态内部类方式 线程安全
 *  类加载不会导致该单实例对象被创建，而是首次使用该对象时才会创建
 *
 *  静态内部类单例模式中实例由内部类创建，由于 JVM 在加载外部类的过程中, 是不会加载静态内部类的,
 *
 *  只有内部类的属性/方法被调用时才会被加载, 并初始化其静态属性。静态属性由于被 static 修饰，保证只被实例化一次，并且严格保证实例化顺序。
 *
 *  第一次加载Singleton类时不会去初始化INSTANCE，只有第一次调用getInstance，虚拟机加载SingletonHolder
 *
 * 并初始化INSTANCE，这样不仅能确保线程安全，也能保证 Singleton 类的唯一性。
 *
 * 	静态内部类单例模式是一种优秀的单例模式，是开源项目中比较常用的一种单例模式。
 *
 * 	在没有加任何锁的情况下，保证了多线程下的安全，并且没有任何性能影响和空间的浪费。
 */
public class Singleton5 {

    //私有构造方法
    private Singleton5() {
    }

    private static class SingletonHo {
        private static final Singleton5 INSTANCE = new Singleton5();
    }

    //对外提供静态方法获取该对象
    public static Singleton5 getInstance() {
        return SingletonHo.INSTANCE;
    }


    public static void main(String[] args) {
        Singleton5 singleton1 = new Singleton5();
        Singleton5 singleton2 = new Singleton5();
        System.out.println(singleton1 == singleton2);
    }

}
